===============================
Классы Record, Field и SubField
===============================

Классы ``Record``, ``Field`` и ``SubField`` предназначены для создания и манипуляции записями, полями и подполями соответственно в клиентском представлении. Они также отвечают за перекодирование записей из серверного представления в клиентское и обратно.

Record
======

Каждый экземпляр класса ``Record`` соответствует одной записи в базе данных ИРБИС и имеет следующие свойства:

* **Database** -- имя базы данных, из которой загружена данная запись. Для вновь созданных записей ``null``. После отправки записи на сервер поле ``Database`` выставляется автоматически.

* **Mfn** -- порядковый номер записи в базе данных. Для вновь созданных записей 0. После отправки записи на сервер поле ``Mfn`` выставляется автоматически. Диапазон значений для MFN: от 1 до 4294967295. Обратите внимание, при реорганизации базы данных MFN записи может измениться!

* **Status** -- состояние записи: удалена, отсутствует и т. д. Для вновь созданных записей 0. После отправки записи на сервер поле ``Status`` выставляется автоматически. Обратите внимание, при реорганизации базе данных логически удалённые записи могут пропасть из неё.

* **Version** -- номер версии записи. Для вновь созданных записей 0. При каждой отправке записи на сервер поле ``version`` выставляется автоматически. Поле ``Version`` используется сервером ИРБИС64 для отслеживания конфликтов одновременного обновления записей несколькими клиентами. Обратите внимание, при реорганизации базе данных её версия может измениться!

* **Fields** -- запись содержит произвольное количество полей. Технически их может быть 0, но на практике это означает сбой системы.

При отправке записи на сервер ИРБИС64 тот отсылает обратно клиенту эту же запись со всеми модификациями, которые были проведены над ней сценарием ``autoin.gbl``. При этом могут измениться любые поля записи, а также её статус и версия.

Атрибуты в виде таблицы:

========= ======== ==========================================================
Поле       Тип      Назначение
========= ======== ==========================================================
Database   string  Имя базы данных, из которой загружена данная запись.
Mfn        int     Номер записи в мастер-файле.
Status     int     Статус записи: логически удалена, отсутствует (см. ниже).
Version    int     Номер версии записи.
Fields     List<>  Список полей записи.
========= ======== ==========================================================

Статус записи: набор флагов

========================= ======= ================================================
Имя                        Число   Значение
========================= ======= ================================================
LogicallyDeleted          1       Логически удалена (может быть восстановлена)
PhysicallyDeleted         2       Физически удалена (не может быть восстановлена)
Absent                    4       Отсутствует
NonActualized             8       Не актуализирована
NewRecord                 16      Первый экземпляр записи
Last                      32      Последняя версия записи
Locked                    64      Запись заблокирована на ввод
AutoinError               128     Ошибка в Autoin.gbl.
FullTextNotActualized     256     Полный текст не актуализирован.
========================= ======= ================================================

Класс ``Record`` содержит следующие методы:

**TO BE DONE**

Field
=====

Поле записи характеризуется числовой меткой в диапазоне от 1 до 2147483647 (на практике встречаются коды от 1 до 9999) и содержит значение до первого разделителя (опционально) и произвольное количество подполей (см. класс ``SubField``).

Стандартом MARC у полей предусмотрены также два односимвольных индикатора, но ИРБИС вслед за ISIS их не поддерживает.

Кроме того, стандарт MARC предусматривает т. наз. "фиксированные" поля с метками от 1 до 9 включительно, которые не должны содержать ни индикаторов, ни подполей, но имеют строго фиксированную структуру. ИРБИС такие поля обрабатывает особым образом только в ситуации импорта/экспорта в формат ISO2709, в остальном же он их трактует точно так же, как и прочие поля (которые стандарт называет полями переменной длины).

Стандартом MARC предусмотрены метки в диапазоне от 1 до 999, все прочие являются самодеятельностью ИРБИС. Поля с нестандартными метками не могут быть выгружены в формат ISO2709.

Хотя технически поле может содержать одновременно и значение до первого разделителя, и подполя, но стандартом такая ситуация не предусмотрена, на практике она означает сбой. В стандарте MARC поле содержит либо значение либо подполя.

Начиная с версии 2018, ИРБИС64 резервирует метку 2147483647 для поля GUID - уникального идентификатора записи.

Порядок подполей в поле важен, т. к. на этот порядок завязана обработка т. наз. "вложенных полей".

Стандартом MARC предусмотрено, что внутри поля могут повторяться подполя с одинаковым кодом, однако, ИРБИС вслед за ISIS очень ограниченно поддерживает эту ситуацию (см. форматный выход ``&umarci``).

Класс ``Field`` имеет следующие атрибуты:

========== ======== =====================================
Поле        Тип      Назначение
========== ======== =====================================
tag         int      Тег поля
value       string   Значение поля до первого разделителя
subfields   List<>   Список подполей
========== ========  =====================================

Класс ``Field`` содержит следующие методы:

**TO BE DONE**

SubField
========

Подполе характеризуется односимвольным кодом (как правило алфавитно-цифровым ``A-Z, 0-9``, но бывают подполя с экзотическими кодами вроде ``!``, ``(`` и др.) и содержит строковое значение (технически может быть пустым, но на практике пустое значение означает сбой).

Коды подполей не чувствительны к регистру. Как правило, ИРБИС приводит коды к верхнему регистру, но это не точно. :)

ИРБИС трактует код подполя '*' как "значение до первого разделителя либо значение первого по порядку подполя" (смотря по тому, что присутствует в записи).

====== ======== ==============================
Поле    Тип      Назначение
====== ======== ==============================
code    string   Код подполя (односимвольный!)
value   string   Значение подполя
====== ======== ==============================

Класс ``SubField`` содержит следующие методы:

**TO BE DONE**